﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Data;
using System.Web.Security;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections;
using System.Web.UI.HtmlControls;

namespace FrontEndPlus.Módulos.Inventarios
{
    public partial class wbfrm_CuentasPorPagar : System.Web.UI.Page
    {
        #region Variables

        private WCF_Gimnasio.cls_Pedidos _pedido = new WCF_Gimnasio.cls_Pedidos();
        private WCF_Gimnasio.ServiceClient _servicio = new WCF_Gimnasio.ServiceClient();
        private WCF_Gimnasio.cls_Proveedor _proveedor = new WCF_Gimnasio.cls_Proveedor();

        private String mensaje_error = String.Empty;


        #endregion
        #region Metodos
        public void GuardarCuentaPorPagar()
        {
            try
            {
                if (!string.IsNullOrEmpty(txt_total.Text))
                {
                    if (Convert.ToDecimal(txt_total.Text) > 0)
                    {
                        _pedido.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
                        _pedido.IdProveedor = Convert.ToInt32(txt_IDproveedor.Text);
                        _pedido.IdGimnasio = 1;

                        _pedido.Numero_factura = txt_factura.Text;
                        _pedido.Nota_Solicitud = txt_descripcion.Text;
                        _pedido.FechaDocumento = Convert.ToDateTime(txt_fecha.Text);
                        _pedido.FechaVencimiento = Convert.ToDateTime(txt_fecha.Text).AddDays(Convert.ToInt32(txt_plazo.Text));
                        _pedido.SubTotal = Convert.ToDecimal(txt_subTotal.Text);
                        _pedido.Descuento = Convert.ToDecimal(txt_descuento.Text);
                        _pedido.Impuesto = Convert.ToDecimal(txt_impuesto.Text);
                        _pedido.Total = Convert.ToDecimal(txt_total.Text);
                        _pedido.Saldo = Convert.ToDecimal(txt_total.Text);
                        _pedido.EstadoSolicitud = 12;
                        _pedido.Tipo_Factura = 2; //FACTURAS A CREDITO O CONTADO

                        _servicio.InsertarActualizarRegistro(true,ref mensaje_error, _pedido);
                        string mensaje = "<script type='text/javascript'> smoke.alert('Factura Ingresada Correctamente', function (e) {}, {ok: 'OK',classname: 'custom-class'}); </script>";
                        ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", mensaje, false);
                        this.CargarPedidosProveedor();

                        
                        limpiarIngresos();
                    }
                    else
                        lbl_mensaje.Text = "MONTO NO PUEDE SER NEGATIVO NI 0";
                }
                else
                    lbl_mensaje.Text = "FACTURA EN BLANCO";
            }
            catch (Exception ex)
            {
                Response.Write(ex.Message);
            }
        }
        public void CargarPedidosProveedor()
        {
            try
            {
                decimal saldoProveedor = 0;
                _pedido.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
                _pedido.IdProveedor = Convert.ToInt32(txt_IDproveedor.Text);
                gv_pagos_proveedores.DataSource = _servicio.Listar(4, _pedido);
                gv_pagos_proveedores.DataBind();

                int filas = gv_pagos_proveedores.Rows.Count;
                if (filas != 0)
                {
                    txt_totalAplicar.Enabled = true;
                    for (int i = 0; i < filas; i++)
                        saldoProveedor += Convert.ToDecimal(gv_pagos_proveedores.Rows[i].Cells[13].Text);
                }
                else
                {
                    string mensaje = "<script type='text/javascript'> smoke.alert('El Proveedor no tiene facturas pendiente', function (e) {}, {ok: 'OK',classname: 'custom-class'}); </script>";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", mensaje, false);
                    saldoProveedor = 0;
                    txt_totalAplicar.Enabled = false;
                }
                txt_saldoTotal.Text = this.retornaNumeroConFormato(saldoProveedor.ToString());
            }
            catch (Exception ex) { Response.Write(ex.Message); }
        }
        public string retornaNumeroConFormato(string numero)
        {
            try
            {
                if (!string.IsNullOrWhiteSpace(numero))
                    return string.Format("{0:N}", Convert.ToDecimal(numero));
                else
                    return "";
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; return ""; }
        }
        private void limpiarIngresos()
        {
            try
            {
                txt_factura.Text = string.Empty;
                txt_impuesto.Text = string.Empty;
                txt_descuento.Text = string.Empty;
                txt_subTotal.Text = string.Empty;
                txt_total.Text = string.Empty;
                txt_descripcion.Text = string.Empty;
                txt_fecha.Text = DateTime.Now.Date.ToShortDateString();
            }
            catch (Exception ex) { Response.Write(ex.Message) ; }
        }
        private void Carga_Datos()
        {
            try
            {
                object resultado = new object();
                _proveedor.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
                _servicio.OtrosProcesos(1, ref resultado, _proveedor);
                txt_factura.Text = resultado.ToString();
                txt_fecha.Text = DateTime.Now.ToShortDateString();
                txt_fecha_pago.Text = DateTime.Now.ToShortDateString();
                this.limpiarPagosProveedores(1);
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        private void calcularTotalFactura()
        {
            try
            {

                if (txt_subTotal.Text != "")
                {
                    if (txt_descuento.Text != "")
                        txt_total.Text = string.Format("{0:N}", Convert.ToDecimal(txt_subTotal.Text) - ((Convert.ToDecimal(txt_subTotal.Text) / 100) * Convert.ToDecimal(txt_descuento.Text)));
                    if (txt_impuesto.Text != "")
                        txt_total.Text = string.Format("{0:N}", Convert.ToDecimal(txt_total.Text) + ((Convert.ToDecimal(txt_subTotal.Text) / 100) * Convert.ToDecimal(txt_impuesto.Text)));
                    if ((txt_descuento.Text == "") && (txt_impuesto.Text == ""))
                        txt_total.Text = string.Format("{0:N}", Convert.ToDecimal(txt_subTotal.Text));
                }
                else
                    txt_total.Text = "";
            }
            
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        private void activarDesactivarPaneles()
        {
            try
            {
                if (TabContainer1.ActiveTabIndex == 0)
                {
                    Panel5.Enabled = false;
                    Panel5.Visible = false;
                    Panel4.Enabled = true;
                    Panel4.Visible = true;
                    
                }
                else
                {
                    Panel5.Enabled = true;
                    Panel5.Visible = true;
                    Panel4.Enabled = false;
                    Panel4.Visible = false;                   
                }
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        private void validaDisponiblesFacturas(GridViewCommandEventArgs e)
        {
            try
            {
                int index = Convert.ToInt32(e.CommandArgument);

                CheckBox ch = (CheckBox)gv_pagos_proveedores.Rows[index].FindControl("CheckBox1");
                
                if (txt_aplicable.Text != "")
                {
                    decimal saldoFactura = Convert.ToDecimal(gv_pagos_proveedores.Rows[index].Cells[13].Text);//13=saldo
                    if (Convert.ToDouble(txt_aplicable.Text) >= 0 || ch.Checked == false)
                    {
                        if (!ch.Checked)
                        {
                            if (Convert.ToDouble(txt_aplicable.Text) > 0)
                            {

                                ch.Checked = true;
                                gv_pagos_proveedores.Columns[2].Visible = true;//2=saldo nuevo
                                gv_pagos_proveedores.Columns[3].Visible = true;//3=monto pagado
                                if (saldoFactura < Convert.ToDecimal(txt_aplicable.Text))
                                {
                                    txt_aplicable.Text = string.Format("{0:N}", Convert.ToDecimal(txt_aplicable.Text) - Convert.ToDecimal(saldoFactura));
                                    gv_pagos_proveedores.Rows[index].Cells[2].Text = "0";
                                    gv_pagos_proveedores.Rows[index].Cells[3].Text = (Convert.ToDecimal(saldoFactura)).ToString();
                                }
                                else
                                {
                                    gv_pagos_proveedores.Rows[index].Cells[2].Text = (Convert.ToDecimal(saldoFactura) - Convert.ToDecimal(txt_aplicable.Text)).ToString();
                                    gv_pagos_proveedores.Rows[index].Cells[3].Text = (Convert.ToDecimal(txt_aplicable.Text)).ToString();
                                    txt_aplicable.Text = string.Format("{0:N}", 0);
                                }
                            }
                            else
                                lbl_mensaje.Text = "NO HAY SALDO DISPONIBLE PARA APLICAR";
                        }
                        else
                        {
                            ch.Checked = false;
                            txt_aplicable.Text = string.Format("{0:N}", Convert.ToDecimal(txt_aplicable.Text) + (Convert.ToDecimal(gv_pagos_proveedores.Rows[index].Cells[13].Text) - Convert.ToDecimal(gv_pagos_proveedores.Rows[index].Cells[2].Text)));
                            gv_pagos_proveedores.Rows[index].Cells[2].Text = DBNull.Value.ToString();
                            gv_pagos_proveedores.Rows[index].Cells[3].Text = DBNull.Value.ToString();
                        }
                    }
                }
                else
                    lbl_mensaje.Text = "DIGITE EL MONTO TOTAL A CANCELAR";
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        private string TraerConsecutivoFactura()
        {
            try
            {
                object resultado = new object();
                _pedido.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
                _servicio.OtrosProcesos(1, ref resultado, _pedido);
                return resultado.ToString();
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; return String.Empty; }
        }
        private void finalizacionProcesoPagoProveedor()
        {

            try
            {
                if (Convert.ToDecimal(txt_aplicable.Text) == 0)
                {
                    if (txt_descripcion_pago.Text != string.Empty)
                    {
                        int facturasAfectadas = 0;

                        object resultado = new object();
                        _pedido.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
                        _servicio.OtrosProcesos(1, ref resultado, _pedido);
                        _pedido.Numero_factura = resultado.ToString();

                        _pedido.IdProveedor = Convert.ToInt32(txt_IDproveedor.Text);
                        _pedido.FechaDocumento = Convert.ToDateTime(txt_fecha_pago.Text);
                        _pedido.Total = Convert.ToDecimal(txt_totalAplicar.Text);
                        _pedido.Nota_Solicitud = txt_descripcion_pago.Text;
                        _pedido.Tipo_Factura = ddl_tipoPago.SelectedIndex;
                        _pedido.Info_pago = ddl_tipoPago.SelectedValue;
                        _pedido.Pago = true;

                        for (int i = 0; i < gv_pagos_proveedores.Rows.Count; i++)
                        {
                            CheckBox ch = (CheckBox)gv_pagos_proveedores.Rows[i].FindControl("CheckBox1");
                            if (ch.Checked == true)
                                facturasAfectadas += 1;
                        }

                        WCF_Gimnasio.cls_Detalle_Pedidos[] _ArrayDetalle = new WCF_Gimnasio.cls_Detalle_Pedidos[facturasAfectadas];
                        _ArrayDetalle = generaDetallesPagosProveedor(_ArrayDetalle);
                        if (_ArrayDetalle != null)
                        {
                            _servicio.InsertarActualizarRegistro(true, ref mensaje_error, _pedido);
                            _pedido.ArrayDetalle = _ArrayDetalle;
                            _servicio.InsertarActualizarRegistro(true, ref mensaje_error, _pedido);
                            _servicio.InsertarActualizarRegistro(false, ref mensaje_error, _pedido);
                            txt_recibo.Text = _pedido.Numero_factura;
                            string mensaje = "<script type='text/javascript'> smoke.alert('Transaccion Procesada', function (e) {}, {ok: 'OK',classname: 'custom-class'}); </script>";
                            ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", mensaje, false);
                            this.limpiarPagosProveedores(2);
                            this.CargarPedidosProveedor();
                        }
                    }
                    else
                        lbl_mensaje.Text = "DEBE INGRESAR LA INFORMACION DE EL PAGO";
                }
                else
                    lbl_mensaje.Text = "EL MONTO A APLICAR DEBER ESTAR EN 0";
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }

        }
        private WCF_Gimnasio.cls_Detalle_Pedidos[] generaDetallesPagosProveedor(WCF_Gimnasio.cls_Detalle_Pedidos[] _ArrayPagos)
        {
            try
            {
                int contadoArray = 0;
                for (int i = 0; i < gv_pagos_proveedores.Rows.Count; i++)
                {
                    CheckBox ch = (CheckBox)gv_pagos_proveedores.Rows[i].FindControl("CheckBox1");

                    if (ch.Checked == true)
                    {
                        _ArrayPagos[contadoArray] = new WCF_Gimnasio.cls_Detalle_Pedidos();
                        _ArrayPagos[contadoArray].Fecha = Convert.ToDateTime(txt_fecha_pago.Text);
                        _ArrayPagos[contadoArray].IdSolicitud = Convert.ToInt32(gv_pagos_proveedores.Rows[i].Cells[15].Text);
                        _ArrayPagos[contadoArray].CantidadAnterior = Convert.ToDecimal(gv_pagos_proveedores.Rows[i].Cells[13].Text);
                        _ArrayPagos[contadoArray].Cantidad = Convert.ToDecimal(gv_pagos_proveedores.Rows[i].Cells[3].Text);
                        _ArrayPagos[contadoArray].CantidadNueva = Convert.ToDecimal(gv_pagos_proveedores.Rows[i].Cells[2].Text);
                        contadoArray += 1;
                    }
                }
                return _ArrayPagos;
            }
            catch (Exception ex) { Response.Write(ex.Message); return null; }
        }
        private void limpiarFormulario()
        {
            try
            {
                
            }
            catch (Exception ex) { Response.Write(ex.Message); }
        }
        private String convertirFecha(string fecha)
        {
            try
            {
                string fechaNueva = string.Empty;
                string mes = fecha.Substring(0, 2);
                string dia = fecha.Substring(3, 2);
                string año = fecha.Substring(6, 4);
                fechaNueva = dia + "/" + mes + "/" + año;
                if (Convert.ToDateTime(fechaNueva) < DateTime.Now.Date)
                {
                    string mensaje = "<script type='text/javascript'> smoke.alert('No se pueden realizar pedidos con fechas anteriores', function (e) {}, {ok: 'OK',classname: 'custom-class'}); </script>";
                    ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", mensaje, false);
                    return DateTime.Now.Date.ToShortDateString();
                }
                else
                return fechaNueva;
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; return String.Empty; }
        }
        private void habilitaAplicable(decimal montoAplicar, decimal saldoProveedor)
        {
            try
            {
                if (saldoProveedor >= montoAplicar && saldoProveedor != 0)
                {
                    lbl_mensaje.Text = "";
                    if (montoAplicar != 0)
                    {
                        lbl_mensaje.Text = "";
                        txt_aplicable.Focus();
                        txt_aplicable.Text = txt_totalAplicar.Text;
                        txt_totalAplicar.Enabled = false;
                        txt_monto_pagado.Text = txt_totalAplicar.Text;
                        b_generar.Enabled = true;
                        txt_fecha_pago.Enabled = true;
                        ddl_tipoPago.Enabled = true;
                        txt_descripcion_pago.Enabled = true;
                    }
                    else
                    {
                        lbl_mensaje.Text = "MONTO NO PUEDE SER 0";
                    }
                }
                else
                {
                    lbl_mensaje.Text = "SOBREPASA EL SALDO DEL PROVEEDOR";
                }
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        private void limpiarPagosProveedores(int opcion)
        {
            try
            {
                if (opcion == 1)
                {
                    txt_aplicable.Text = string.Empty;
                    txt_totalAplicar.Text = string.Empty;
                    txt_totalAplicar.Enabled = true;
                    txt_monto_pagado.Text = string.Empty;
                    txt_descripcion_pago.Text = string.Empty;
                    txt_descripcion_pago.Enabled = false;
                    txt_recibo.Text = string.Empty;
                    ddl_tipoPago.SelectedIndex = 0;
                    ddl_tipoPago.Enabled = false;
                    txt_fecha_pago.Text = DateTime.Now.ToShortDateString();
                    txt_fecha_pago.Enabled = false;
                    b_generar.Enabled = false;
                    lbl_mensaje.Text = "";
                    gv_pagos_proveedores.SelectedIndex = -1;
                    this.CargarPedidosProveedor();
                }
                else
                    if (opcion == 2)
                    {
                        txt_aplicable.Text = string.Empty;
                        txt_totalAplicar.Text = string.Empty;
                        txt_totalAplicar.Enabled = true;
                        txt_descripcion_pago.Text = string.Empty;
                        txt_descripcion_pago.Enabled = false;
                        ddl_tipoPago.SelectedIndex = 0;
                        ddl_tipoPago.Enabled = false;
                        txt_fecha_pago.Text = DateTime.Now.ToShortDateString();
                        txt_fecha_pago.Enabled = false;
                        b_generar.Enabled = false;
                    }
                   
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        private void limpiarLabel()
        {
            try
            {
                lbl_mensaje.Text = "";
            }
            
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {
            this.limpiarLabel();
            if (!IsPostBack)
            {
                TabContainer1.ActiveTabIndex = 0;
                if (Request.QueryString["idProv"] != null)
                {
                    txt_IDproveedor.Text = Request.QueryString["idProv"];
                    txt_nombre_proveedor.Text = Request.QueryString["nomProv"];
                    txt_plazo.Text = Request.QueryString["plazo"];
                    TabContainer1.Enabled = true;
                    lbl_mensaje.Text = String.Empty;
                    this.Carga_Datos();
                    this.CargarPedidosProveedor();
                }
                else
                    lbl_mensaje.Text = "Seleccione un proveedor";

            }
        }

        protected void b_generar_Click(object sender, EventArgs e)
        {
            if (Page.IsValid)
            {
                this.finalizacionProcesoPagoProveedor();
            }
        }

        protected void b_agregar_cuenta_Click(object sender, EventArgs e)
        {
           
            if (Page.IsValid)
            {
                this.GuardarCuentaPorPagar();
            }
        }

        protected void ib_buscar_proveedor_Click(object sender, ImageClickEventArgs e)
        {
            int bandera = 2;
            Response.Redirect("wbfrm_Buscar_Proveedor.aspx?bandera="+bandera);
        }

        protected void b_limpiar_Click(object sender, EventArgs e)
        {
            this.limpiarPagosProveedores(1);
        }
        protected void TabContainer1_ActiveTabChanged(object sender, EventArgs e)
        {
            this.activarDesactivarPaneles();
        }

        protected void txt_subTotal_TextChanged(object sender, EventArgs e)
        {
            this.calcularTotalFactura();
        }

        protected void txt_descuento_TextChanged(object sender, EventArgs e)
        {
            this.calcularTotalFactura();
        }

        protected void txt_impuesto_TextChanged(object sender, EventArgs e)
        {
            this.calcularTotalFactura();
        }

        protected void TabContainer1_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                this.activarDesactivarPaneles();
            }
        }

        protected void gv_pagos_proveedores_RowCommand(object sender, GridViewCommandEventArgs e)
        {            
                this.validaDisponiblesFacturas(e);
        }

        protected void txt_fecha_TextChanged(object sender, EventArgs e)
        {
            txt_fecha.Text = this.convertirFecha(txt_fecha.Text);
        }

        protected void txt_fecha_pago_TextChanged(object sender, EventArgs e)
        {
            txt_fecha_pago.Text = this.convertirFecha(txt_fecha_pago.Text);
        }

        protected void txt_totalAplicar_TextChanged(object sender, EventArgs e)
        {
            try
            {
                if (txt_totalAplicar.Text != string.Empty)
                    habilitaAplicable(Convert.ToDecimal(txt_totalAplicar.Text), Convert.ToDecimal(txt_saldoTotal.Text));
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
    }
}